괴담집 프로젝트의 n8n 이야기 생성 워크플로우 개선하기

작성일:2025. 8. 5.
수정일:2025. 8. 11.
최초의 워크플로우 모습
최초의 워크플로우 모습

최초에 만들었던 이야기 생성 워크플로우는 매우 단순했다. 단 하나의 프롬프트를 활용해서 만들었으며 하나의 프롬프트가 창의적인 이야기 생성과 퀄리티 관리를 전부 담당하고 있었다.

하지만 너무 단순한 방식으로는 비슷한 이야기의 반복, 이야기의 공포감이 균일하지 않음, 지침을 제대로 따르지 못하는 상황 발생 등 여러가지 문제가 있었다.

해당 문제를 해결하기 위해 처음 도입을 시도했던 방식은 공포 씨앗 생성 모델을 둬서 좋은 조합의 재료들을 먼저 만들고 넘기는 것이었다.

하지만 해당 과정도 프롬프트이다보니 점점 정형화된 틀이 보였다.

문제에 대한 해결#

수정된 이야기 워크플로우
수정된 이야기 워크플로우

여러가지 문제를 하나하나 기술적인면 그리고 프롬프트와 워크플로우를 통해서 해결하기 위해 고민하였고 해결하였다. 특히 하나의 프롬프트를 사용할 때에는 이야기의 퀄리티가 들쑥 날쑥 갑자기 조상님이 나와서 줄줄설명해주는등 여러가지 문제가 보였고 해당 부분을 프롬프트를 통해 제어하려고 시도했지만 프롬프트 자체가 너무 길어서 그런지 제대로 동작하지 않았다.

따라서 실제 소설이나 영화가 어떻게 만들어지는지 찾아보았고 해당 과정을 적용하여 최종 이야기를 만들어 보기로 하였다.

사람들이 글을 쓸 때에는 대부분 생각난 아이디어를 통해 글을 작성하게 되는데 여기서 이 '아이디어'는 이야기의 시작이 될 수도 이야기의 끝이 될수도 혹은 이야기의 메인 핵심 재료일 수도 있다. 즉 여러 가지 다양한 아이디어로부터 시작될수 있고 이 시작 위치는 아무도 모른다는 것이다.

이것을 AI에게 적용시키기 위해 다음과 같은 재료를 지정해주기 시작 하였다.

이 단계의 핵심은 핵심 아이디어가 될 수 있는 다양한 항목들을 랜덤으로 던져주는 것이다.

이야기의 재료#

가장 확실하게 여러가지 다양한 공포 이야기가 나타나고 비슷한 이야기가 나오지 않게 하기 위해선 재료를 가장 먼저 던저주는 것이라고 생각했다.

그래서 떠올린 방법은 strapi를 통해 supabase에 이야기의 재료들을 타입에 따라 여러가지를 저장하고 n8n워크플로의 시작에 랜덤으로 각 재료당 하나씩 불러와 이야기를 만드는 것이었다.

재료 구조
재료 구조

이야기의 재료는 공포의 유형, 주인공의 성격, 주인공 프로파일, 플롯의 종류 로 이루어 진다. 각각 단순하게 이름과 설명만 존재하는 매우 단순한 형태이다 각각 단순하게 이름과 설명만 존재하는 매우 단순한 형태이다.

gemini-cli와 supabase-mcp를 통해 여러가지 죵류들을 생성하고 저장해 주었다.

재료 가져오기
재료 가져오기

이 재료들을 하나씩 랜덤으로 가져오기 위해서 sql에서 Postgresql 함수를 작성하고 rpc로 접근하는 방식을 사용했다.

작업의 속도를 빠르게 하기위해 supabase-mcp를 사용했으며 약 1분정도만에 함수를 만들고 사용할 url을 받아와 적용 하였다.

이야기의 퀄리티와 개연성을 높이기#

위에서 랜덤으로 설정한 항목들 덕분에 이야기들이 겹치지 않고 다양하게 나오기 시작했지만 다른 문제가 있었다. 바로 이야기의 품질이 일정하지 않다는 것이다. 여기에서 필요한것이 글 작성의 시작 이후에 구체화 시키는 단계들이다.

내가 설정한 단계는 총 3단계에 걸쳐 이야기를 완성하는 것이다.

플롯 만들기->시놉시스 만들기->최종 이야기 완성하기

위의 방식은 창작가들이 아이디어를 구체화 시키는 과정을 따랐다.

플롯 생성#

이야기의 플롯에는 구체적인 대사나 요소들이 담기지 않는다. 단 주인공의 상태와 상황 그리고 공포에 해당하는 아이템들에 대한 설정들 배경에 대한 설정들 그리고 기승전결이 어떤식으로 흘러가는지가 나오게 된다. 즉 이야기의 설계도 혹은 뼈대가 된다.

설정한 프롬프트를 통해 제공 받는 플롯의 예시는 다음과 같다.

Markdownmarkdown

시놉시스 생성#

대부분 검색을 했을때 나오는 시놉시스에 대한 설명은 완성된 이야기의 요약본이라고 한다. 하지만 창작의 영역에서 시놉시스는 플롯을 구체화시키고 실제 이야기를 만들기 전에 플롯을 더 구체화시키고 다듬는 역할을 한다고 한다.

해당 단계를 통해 구체적인 등장인물들과 장면들 그리고 구체화 되지 않은 아이디어들을 시각화 한다. 이 시놉시스를 통해 얻게되는 결과물의 예시는 다음과 같다.

Markdownmarkdown

이야기 생성#

이야기 생성 단계의 프롬프트를 통해 시놉시스를 통해 설계된 설정들에 살을 붙혀 연출을 하게 된다. 이 아래에는 위의 예시 단계의 요소들로 얻게된 최종 이야기 예시이다.

Markdownmarkdown

이야기들의 질 평준화#

사실 맨 처음엔 플롯->시놉시스->완성형 이야기 의 과정을 각 하나의 프롬프트를 통해 처리했었다. 하지만 이렇게 했을때 몇몇개의 문제가 발생하였다.

  1. 흥미로운 이야기가 마지막에 외계인이 나오며 세계관을 망가뜨린다.
  2. 악역이 마지막에 들킨 이후 자신의 계획들과 사실을 술술 말한다.
  3. 귀신이나 괴물이 사람의 말로 이야기하고 대화한다.
  4. 초음파 살인이나,가상 세계같은 현실적으로 공감하기 어려운 공포가 주제로 나오곤 한다.

나머지 모든 이야기의 구조나 흘러가는 방식도 모두 좋았으나 위의3개에 해당하는 문제가 발생할 때가 생긴다. 이것들을 프롬프트를 통해 지침으로 금지사항으로 넣어 뒀음에도 제대로 처리하지 못하고 나타날때가 있었다.

이 문제를 해결하기 위해 각각 플롯, 시놉시스, 이야기 생성 단계에 검수단계와 수전단계 2단계를 추가해 주었다.

생성-검수-수정
생성-검수-수정

해당 단계를 추가한 이후론 이런 현상이 싹 사라지고 좋은 퀄리티의 이야기만 나왔다.

프롬프트를 구성할때 주의해야할 점은 생성, 검수, 수정 전부 같은 조건들을 잘 공유해야하며 플롯과 시놉시스 둘다 본래의 목적보다 구체화되는걸 주의해야한다 그렇지 않다면 해당 파트를 계속 구체화 시키며 굼수와 수정을 반복하게 된다.